#pragma once

#include <QObject>
#include <QSqlDatabase>
#include <QSqlError>
#include <QSqlQuery>
#include <QVariant>

/*!
 * \brief 数据库基类
 */
class DataBase : public QObject {
    Q_OBJECT
public:
    /*!
     * \brief DataBase 构造/析构函数
     */
    explicit DataBase(QObject* parent = nullptr);
    virtual ~DataBase();

    /*!
     * \brief addDataBase 添加数据库
     * \param dbName 数据库名称
     * \param connectName 连接名称
     * \return 创建状态
     */
    const bool addDataBase(const QString &dbName, const QString &connectName);

    const bool addFerryDataBase(const QString &dbName, const QString &connectName);
    /*!
     * \brief checkTableExists 检查表是否存在
     * \param tableName 表名称
     * \return 存在状态
     */
    const bool checkTableExists(const QString &tableName);
    /*!
     * \brief createTable 创建表
     * \param tableName 表名称
     * \param columns 列项 "text TEXT, time TEXT"
     * \return 创建状态
     */
    const bool createTable(const QString &tableName, const QString &columns);

    const bool createFerryTable(const QString &tableName, const QString &columns);

    /*!
     * \brief removeTable 删除表
     * \param tableName 表名称
     * \return 删除状态
     */
    const bool removeTable(const QString &tableName);
    /*!
     * \brief addRecord 添加记录
     * \param tableName 表名称
     * \param records 记录 {"header1":"data1","header2":"data2"}
     * \return 添加状态
     */
    const bool addRecord(const QString &tableName, const QVariantMap& records);

    const bool addFerryRecord(const QString &tableName, const QVariantMap &records);
    /*!
     * \brief queryRecordCount 查询记录条数
     * \param tableName 表名称
     * \return 记录条数
     */
    const int queryRecordCount(const QString &tableName);
    /*!
     * \brief queryPagingRecord 分页查询记录
     * \param tableName 表名称
     * \param page 页
     * \param count 条数
     * \return 记录
     */
    const QVariant queryPagingRecord(const QString &tableName, int page, int count);
    /*!
     * \brief queryAllRecord 查询所有记录
     * \param tableName 表名称
     * \return 记录
     */
    const QVariant queryAllRecord(const QString &tableName);

    QVariantList queryFerryAllRecord(const QString &tableName);
    /*!
     * \brief removeAllRecord 删除所有记录
     * \param tableName 表名称
     * \return 删除状态
     */
    const bool removeAllRecord(const QString &tableName);
    /*!
     * \brief getDataBasePath 获取数据库路径
     * \return 数据库路径
     */
    Q_INVOKABLE const QString getDataBasePath();
    /*!
     * \brief getDataBaseSize 获取数据库大小
     * \return 数据库大小
     */
    Q_INVOKABLE const QString getDataBaseSize();
    /*!
     * \brief m_db 数据库实例
     */
    QSqlDatabase m_db;
private:

};
